#include "ringBuf.h"
/*
    * 初始化环形缓冲区
    * rb: 环形缓冲区指针
    * buf: 环形缓冲区数据存储区指针
    * size: 环形缓冲区数据存储区大小
    *
*/
void ringBufInit(ringBuf_t *rb, unsigned char *buf, unsigned int size)
{
    rb->buf = buf;
    rb->size = size;
    rb->in = 0;
    rb->out = 0;
}

/*
    * 向环形缓冲区写入数据
    * rb: 环形缓冲区指针
    * buf: 数据存储区指针
    * len: 数据长度
    * 返回值: 成功写入的数据长度
*/

unsigned int ringBufPut(ringBuf_t *rb, unsigned char *buf, unsigned int len)
{
    unsigned int i;
    for (i = 0; i < len; i++)
    {
        if (ringBufFull(rb))
        {
            break;
        }
        rb->buf[rb->in] = buf[i];
        rb->in = (rb->in + 1) % rb->size;
    }
    return i;
}
/*
    * 从环形缓冲区读取数据
    * rb: 环形缓冲区指针
    * buf: 数据存储区指针
    * len: 数据长度
    * 返回值: 成功读取的数据长度
*/
unsigned int ringBufGet(ringBuf_t *rb, unsigned char *buf, unsigned int len)
{
    unsigned int i;
    for (i = 0; i < len; i++)
    {
        if (ringBufEmpty(rb))
        {
            break;
        }
        buf[i] = rb->buf[rb->out];
        rb->out = (rb->out + 1) % rb->size;
    }
    return i;
}

/*
    * 获取环形缓冲区有效数据长度
    * rb: 环形缓冲区指针
    * 返回值: 环形缓冲区有效数据长度
*/
unsigned int ringBufLen(ringBuf_t *rb)
{
    return (rb->in - rb->out + rb->size) % rb->size;
}

/*
    * 获取环形缓冲区剩余空间
    * rb: 环形缓冲区指针
    * 返回值: 环形缓冲区剩余空间
*/

unsigned int ringBufFree(ringBuf_t *rb)
{
    return (rb->out - rb->in + rb->size - 1) % rb->size;
}
/*
    * 判断环形缓冲区是否已满
    * rb: 环形缓冲区指针
    * 返回值: 1表示已满，0表示未满
*/

unsigned int ringBufFull(ringBuf_t *rb)
{
    return (rb->in + 1) % rb->size == rb->out;
}
/*
    * 判断环形缓冲区是否为空
    * rb: 环形缓冲区指针
    * 返回值: 1表示为空，0表示不为空
*/
unsigned int ringBufEmpty(ringBuf_t *rb)
{
    return rb->in == rb->out;
}


//单元测试函数，用于测试环形缓冲区是否正常工作
void ringBufTest(void)
{
    
    unsigned char ringMem[100];
    //生成一个随机数组
    unsigned char ringTestDataPack1[3] = {0x01, 0x02, 0x03};
    //生成第二个随机数组
    unsigned char ringTestDataPack2[3] = {0x04, 0x05, 0x06};
    //用于读取的缓存
    unsigned char ringTestReadBuf[10];

    // 初始化环形缓冲区
    ringBuf_t ringBuf;
    ringBufInit(&ringBuf, ringMem, sizeof(ringMem));

    //向环形缓冲区写入第一个测试数组
    ringBufPut(&ringBuf, ringTestDataPack1, sizeof(ringTestDataPack1));
    //通过printf打印ringbuf的剩余空间，有效数据长度 应该是97，3
    //PRINTF("ringBufFree:%d, ringBufLen:%d\r\n", ringBufFree(&ringBuf), ringBufLen(&ringBuf));
    
    //从环形缓冲区读取所有数据
    ringBufGet(&ringBuf, ringTestReadBuf, ringBufLen(&ringBuf));
    //打印读出的数据
    //PRINTF("ringTestReadBuf:%02x %02x %02x\r\n", ringTestReadBuf[0], ringTestReadBuf[1], ringTestReadBuf[2]);

    //向环形缓冲区写入第二个测试数组
    ringBufPut(&ringBuf, ringTestDataPack2, sizeof(ringTestDataPack2));
    // 读取1个字节
    ringBufGet(&ringBuf, ringTestReadBuf, 1);
    //打印读出的数据
    //PRINTF("ringTestReadBuf:%02x\r\n", ringTestReadBuf[0]);
    //通过printf打印ringbuf的剩余空间，有效数据长度 应该是98，2
    //PRINTF("ringBufFree:%d, ringBufLen:%d\r\n", ringBufFree(&ringBuf), ringBufLen(&ringBuf));
    
}
